home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Visual Basic Graphics Programming (2nd Edition)
/
Visual Basic Graphics Programming 2nd Edition.iso
/
OldSrc
/
CH6
/
SRC
/
CYCLOID2.FRM
< prev
next >
Wrap
Text File
|
1996-04-24
|
8KB
|
310 lines
VERSION 4.00
Begin VB.Form Cycloid2Form
Caption = "Cycloid 2"
ClientHeight = 5670
ClientLeft = 2085
ClientTop = 735
ClientWidth = 4830
Height = 6360
Left = 2025
LinkTopic = "Form1"
ScaleHeight = 378
ScaleMode = 3 'Pixel
ScaleWidth = 322
Top = 105
Width = 4950
Begin VB.TextBox DtText
Height = 285
Left = 240
TabIndex = 11
Text = "0.025"
Top = 45
Width = 615
End
Begin VB.TextBox QText
Height = 285
Left = 2280
TabIndex = 10
Text = "7"
Top = 45
Width = 615
End
Begin VB.TextBox PText
Height = 285
Left = 1320
TabIndex = 9
Text = "20"
Top = 45
Width = 615
End
Begin VB.TextBox RText
Height = 285
Left = 3285
TabIndex = 8
Text = "15"
Top = 45
Width = 615
End
Begin VB.TextBox ThetaText
Height = 285
Left = 4200
TabIndex = 6
Text = "-45"
Top = 480
Width = 615
End
Begin VB.TextBox YscaleText
Height = 285
Left = 2160
TabIndex = 4
Text = "1.2"
Top = 480
Width = 615
End
Begin VB.TextBox XscaleText
Height = 285
Left = 600
TabIndex = 2
Text = "0.7"
Top = 480
Width = 615
End
Begin VB.CommandButton CmdGo
Caption = "Go"
Default = -1 'True
Height = 375
Left = 4200
TabIndex = 1
Top = 0
Width = 615
End
Begin VB.PictureBox Canvas
AutoRedraw = -1 'True
Height = 4815
Left = 0
ScaleHeight = -2.2
ScaleLeft = -1.1
ScaleMode = 0 'User
ScaleTop = 1.1
ScaleWidth = 2.2
TabIndex = 0
Top = 840
Width = 4815
End
Begin VB.Label Label1
Caption = "dt"
Height = 255
Index = 6
Left = 0
TabIndex = 15
Top = 60
Width = 255
End
Begin VB.Label Label1
Caption = "Q"
Height = 255
Index = 4
Left = 2115
TabIndex = 14
Top = 60
Width = 255
End
Begin VB.Label Label1
Caption = "P"
Height = 255
Index = 1
Left = 1200
TabIndex = 13
Top = 60
Width = 255
End
Begin VB.Label Label1
Caption = "R"
Height = 255
Index = 0
Left = 3120
TabIndex = 12
Top = 60
Width = 255
End
Begin VB.Label Label1
Caption = "Angle (degrees)"
Height = 255
Index = 5
Left = 3000
TabIndex = 7
Top = 525
Width = 1215
End
Begin VB.Label Label1
Caption = "Y scale"
Height = 255
Index = 3
Left = 1560
TabIndex = 5
Top = 525
Width = 615
End
Begin VB.Label Label1
Caption = "X scale"
Height = 255
Index = 2
Left = 0
TabIndex = 3
Top = 525
Width = 615
End
Begin VB.Menu mnuFile
Caption = "&File"
Begin VB.Menu mnuFileExit
Caption = "E&xit"
End
End
End
Attribute VB_Name = "Cycloid2Form"
Attribute VB_Creatable = False
Attribute VB_Exposed = False
Option Explicit
Const PI = 3.14159
Const TWO_PI = 2 * PI
Dim P As Integer
Dim Q As Integer
Dim R As Integer
Dim P_Q As Single
Dim PQ As Integer
Dim PQR As Integer
' ************************************************
' Draw the curve on the indicated picture box.
' ************************************************
Sub DrawCurve(pic As PictureBox, start_t As Single, stop_t As Single, Dt As Single, xscale As Single, yscale As Single, theta As Single)
Dim x1 As Single
Dim y1 As Single
Dim x2 As Single
Dim y2 As Single
Dim ctheta As Single
Dim stheta As Single
Dim t As Single
' Save these values because we use them a lot.
stheta = Sin(theta)
ctheta = Cos(theta)
x1 = xscale * X(start_t)
y1 = yscale * Y(start_t)
x2 = x1 * ctheta - y1 * stheta
y2 = x1 * stheta + y1 * ctheta
pic.Cls
pic.CurrentX = x2
pic.CurrentY = y2
t = start_t + Dt
Do While t < stop_t
x1 = xscale * X(t)
y1 = yscale * Y(t)
x2 = x1 * ctheta - y1 * stheta
y2 = x1 * stheta + y1 * ctheta
pic.Line -(x2, y2)
t = t + Dt
Loop
x1 = xscale * X(stop_t)
y1 = yscale * Y(stop_t)
x2 = x1 * ctheta - y1 * stheta
y2 = x1 * stheta + y1 * ctheta
pic.Line -(x2, y2)
End Sub
' ************************************************
' Non-recursively compute the greatest common
' divisor of to integers.
' ************************************************
Private Function GCD(ByVal a As Integer, ByVal b As Integer) As Integer
Dim B_Mod_A As Integer
B_Mod_A = b Mod a
Do While B_Mod_A <> 0
' Prepare the arguments for the "recursion."
b = a
a = B_Mod_A
B_Mod_A = b Mod a
Loop
GCD = a
End Function
' ************************************************
' Find the least common multiple of two integers.
' ************************************************
Function LCM(a As Integer, b As Integer) As Integer
LCM = a * b / GCD(a, b)
End Function
' ************************************************
' Calculate the values t must cross to draw a
' cycloid.
' ************************************************
Sub SetTBounds(tmin As Single, tmax As Single)
tmin = 0
' LCM / P * 2 * PI.
tmax = Q / GCD(P, Q) * TWO_PI
End Sub
' ************************************************
' The parametric function X(t).
' ************************************************
Function X(t As Single) As Single
X = (PQ * Cos(t) + R * Cos(t * P_Q)) / (PQR)
End Function
' ************************************************
' The parametric function Y(t).
' ************************************************
Function Y(t As Single) As Single
Y = (PQ * Sin(t) + R * Sin(t * P_Q)) / PQR
End Function
Private Sub CmdGo_Click()
Dim tmin As Single
Dim tmax As Single
Dim Dt As Single
Dim xscale As Single
Dim yscale As Single
Dim theta As Single
P = CInt(PText.Text)
Q = CInt(QText.Text)
R = CInt(RText.Text)
P_Q = P / Q
PQ = P + Q
PQR = PQ + R
SetTBounds tmin, tmax
Dt = CSng(DtText.Text)
xscale = CSng(XscaleText.Text)
yscale = CSng(YscaleText.Text)
theta = CSng(ThetaText.Text) / 180 * PI
DrawCurve Canvas, tmin, tmax, Dt, xscale, yscale, theta
End Sub
Private Sub mnuFileExit_Click()
Unload Me
End Sub